package edu.nwpu.controller;


import com.alibaba.fastjson.JSON;
import edu.nwpu.pojo.User;
import edu.nwpu.service.UserService;
import edu.nwpu.utils.TokenUtil;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@RestController
public class UserController {

    @Resource(name = "userService")
    private UserService userService;

    /**
     * 用户登录 访问地址:/user/login 返回json
     * post请求，必须包含name和password两个请求参数
     * name为用户名，password为用户密码
     *
     * @param name: 用户名
     * @param pwd: 密码
     *
     * @return java.lang.String 回复map解析的json字符串
     * status为固定键，值有success和failed两种情况，前者表示登录成功，后者表示登录失败
     * 登录成功时附加token键，内容是用户的token
     * 登录失败时附加info键，内容是登录失败的原因
     */
    @ApiOperation(value = "登录", httpMethod = "POST", response = String.class,
            notes = "登录成功时附加token键，内容是用户的token；" +
                    "登录失败时附加info键，内容是登录失败的原因")
    @PostMapping("/user/login")
    public String login(@RequestParam("name") String name,
                        @RequestParam("password") String pwd) {
        return JSON.toJSONString(userService.login(name, pwd));
    }

    /**
     * 用户注册 访问地址:/user/register 返回json
     * post请求，必须包含name、password、phoneNo三个请求参数
     * name为用户名，password为用户密码，phoneNo为电话号码x
     *
     * @param name: 用户名
     * @param pwd: 密码
     * @param phoneNo: 电话号码
     *
     * @return java.lang.String 回复map解析的json字符串
     * status为固定键，值有success和failed两种情况，前者表示注册成功，后者表示注册失败
     * 登录成功时附加token键，内容是用户的token
     * 登录失败时附加info键，内容是登录失败的原因
     */
    @ApiOperation(value = "注册", httpMethod = "POST", response = String.class,
            notes = "注册成功时附加token键，内容是用户的token；" +
                    "注册失败时附加info键，内容是注册失败的原因")
    @PostMapping("/user/register")
    public String register(@RequestParam("name") String name,
                           @RequestParam("password") String pwd,
                           @RequestParam("phoneNo") String phoneNo) {
        return JSON.toJSONString(userService.register(name, pwd, phoneNo));
    }

    /**
     * 通过id获取用户的信息
     * 包括：用户id、用户名、用户手机号
     *
     * @param id: 用户id
     *
     * @return java.lang.String 用户信息json数据
     */
    @ApiOperation(value = "获取用户信息", httpMethod = "GET", response = String.class,
            notes = "返回json；出错返回error，内容是出错信息；不出错返回User的信息")
    @GetMapping("/user/info")
    public String getUserInfo(@RequestParam("id") Long id) {
        Map<String, Object> response = new HashMap<>(2);
        User user = userService.getUserById(id);
        if (null == user) {
            response.put("status", "failed");
            response.put("info", "无法找到此用户id");
            return JSON.toJSONString(response);
        }
        response.put("status", "success");
        response.put("info", getUserInfoMap(user));
        return JSON.toJSONString(response);
    }

    /**
     * 更新user账户信息
     * 返回操作结果json
     *
     * @param user: userForm实体类
     *
     * @return java.lang.String 返回的json字符串
     */
    @ApiOperation(value = "修改用户信息", httpMethod = "POST", response = String.class,
            notes = "返回json")
    @PostMapping("/user/update/info")
    public String updateUserInfo(User user) {
        Map<String, Object> response = userService.updateUserInfo(user);
        return JSON.toJSONString(response);
    }

    /**
     * 更新user的密码
     * 返回操作结果的json字符串
     *
     * @param id: 用户id
     * @param oldPwd: 用户旧密码
     * @param newPwd: 用户新密码
     * @param newPwdRe: 用户重复的新密码
     *
     * @return java.lang.String 操作结果json
     */
    @ApiOperation(value = "修改用户密码", httpMethod = "POST", response = String.class,
            notes = "返回json")
    @PostMapping("/user/update/password")
    public String updateUserPassword(
            @RequestParam("id") Long id,
            @RequestParam("old_pwd") String oldPwd,
            @RequestParam("new_pwd") String newPwd,
            @RequestParam("new_pwd_repeat") String newPwdRe) {
        Map<String, Object> response = userService.updateUserPassword(id, oldPwd, newPwd, newPwdRe);
        return JSON.toJSONString(response);
    }

    /**
     * 根据user实体类获取用户的账户信息map
     * 包括user id、user name、 user phoneNo
     *
     * @param user: user实体类
     *
     * @return java.util.Map<java.lang.String,java.lang.Object> 用户信息的map
     */
    private Map<String, Object> getUserInfoMap(User user) {
        Map<String, Object> info = new HashMap<>();
        info.put("uid", user.getId());
        info.put("name", user.getName());
        info.put("phoneNo", user.getPhoneNo());
        return info;
    }

}
